﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using myFinance.BLL;
using myFinance.Models;
using myFinance.Models.ViewModels;
using System.Web.Helpers;
using System.IO;
using System.Diagnostics;
using System.Web;
using System.Web.UI.WebControls;

namespace myFinance.Controllers
{
    [Authorize]
    public class PerfilController : Controller
    {
        #region ViewModels
        #endregion

        #region Index
        public ActionResult Index() // Index padrão
        {
			var usuario = User.Identity.Name;            
            Session["nomeUsuario"] = usuario;

			var model = PessoaBll.GetPessoa(usuario);
			if (model == null)
			{
				model = new Pessoa();
				model.DataCadastro = DateTime.Now;
				ViewBag.Nome = usuario;
				model.Usuario = usuario;
				AvatarStream.Avatar = null;
				return View(model);
			}
			else
			{
				var b = new byte[] { 0 };
				if (model.Avatar != null && !model.Avatar.SequenceEqual(b))
					AvatarStream.Avatar = new WebImage(model.Avatar);
				ViewBag.Nome = model.Nome;
				return View(model);
			}
        }
        #endregion

		#region Cadastro
        public ActionResult IncluirAvatar()
        {
            var model = new AvatarViewModel();
            ViewBag.Incluir = "não";
            return View(model);
        }

        /// <summary>
        /// Faz o upload de imagens e grava em uma pasta temporaria
        /// </summary>
        /// <param name="model">AvatarViewModel</param>
        /// <returns>View</returns>
        [HttpPost]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Upload(AvatarViewModel model)
        {
            HttpPostedFileBase file = Request.Files["ImageUrl"];
            AvatarStream.NovoAvatar = new WebImage(file.InputStream);

            ViewBag.Incluir = "sim";
            return View("IncluirAvatar", model);
        }

        public ActionResult EditarAvatar()
        {
            ViewBag.Incluir = "não";
            return View();
        }

        public ActionResult Crop(int top, int left, int bottom, int right)
        {
            try
            {
                var avatar = AvatarStream.NovoAvatar;
                AvatarStream.Avatar = ImagemBll.CropImage(top, left, bottom, right, 200, 200, avatar);
                var model = PessoaBll.GetPessoa(User.Identity.Name);
                if (model != null)
                {
                    model.Avatar = AvatarStream.Avatar.GetBytes();
                    PessoaBll.Edit(model);
                }
                return Json(true);
            }
            catch
            {
                return Json(false);
            }
        }

        public ActionResult ShowAvatar()
        {
            var logo = AvatarStream.Avatar != null ? AvatarStream.Avatar.GetBytes() : null;

            if (logo == null)
            {
                FilePathResult file = new FilePathResult(Url.Content("~/Content/Imagens/default_avatar.gif").ToString(), "image/jpg");
                return file;
            }
            else
            {
                return File(logo, "image/jpg");
            }
        }

        public ActionResult ShowAvatarForEdit()
        {
            AvatarStream.NovoAvatar = AvatarStream.NovoAvatar.Resize(480, (480 * AvatarStream.NovoAvatar.Height) / AvatarStream.NovoAvatar.Width);
            var logo = AvatarStream.NovoAvatar.GetBytes();

            return File(logo, "image/jpg");
        }

        public ActionResult ShowMicroAvatar()
        {
            var avatar = PessoaBll.GetAvatar(User.Identity.Name);

            var b = new byte[] { 0 };
            if (avatar == null || avatar.SequenceEqual(b))
            {
                FilePathResult file = new FilePathResult(Url.Content("~/Content/Imagens/default_microavatar.jpg").ToString(), "image/jpg");
                return file;
            }
            else
            {
                var logo = new WebImage(avatar).Resize(25, 25, true, true);                
                return File(logo.GetBytes(), "image/jpg");
            }
        }
        #endregion

        #region Salvar
        [HttpPost]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(Pessoa modelView) // Método de gravação do registro
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var tempImage = new byte[] { 0 };
                    if (AvatarStream.Avatar != null)
                        tempImage = AvatarStream.Avatar.GetBytes();


                    if (modelView.Id > 0)
                    {
                        var model = PessoaBll.GetPessoa(modelView.Id);
                        TryUpdateModel(model);
                        if (tempImage != null)
                            model.Avatar = tempImage;
                        PessoaBll.Edit(model);
                    }
                    else
                    {
                        var model = new Pessoa();
                        TryUpdateModel(model);
                        model.Avatar = tempImage;
                        PessoaBll.Add(model);
                    }

                    return RedirectToAction("Index", "Home");
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError(string.Empty, ex);
                    return View(modelView);
                }
            }
            else
            {
                return View(modelView);
            }
        }
        #endregion

        #region Excluir
		//[HttpPost]
		//public ActionResult Excluir(int id) // Método de exclusão do registro
		//{
		//    try
		//    {
		//        PessoaBll.Delete(id);
		//        return Json(true);
		//    }
		//    catch (Exception ex)
		//    {
		//        string msgEx = "Houve um erro na exclusão do registro:";
		//        if (ex.InnerException == null)
		//        {
		//            msgEx += ex.Message;
		//        }
		//        else
		//        {
		//            msgEx += ex.InnerException.Message;
		//        }
		//        return Json(new { msgErro = msgEx });
		//    }
		//}
        #endregion

        #region Validação
        public ActionResult ValidarCPF(string cpf)
        {
            if (cpf.Equals("___.___.___-__"))
                return Json(true, JsonRequestBehavior.AllowGet);
            else
                return Json(PessoaBll.ValidarCPF(cpf), JsonRequestBehavior.AllowGet);
        }
        #endregion
    }
}
